﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Compte
{
    public class Utilisateur : SQLExec
    {
        public String Nom { get; set; }
        public Decimal Solde { get; set; }

        public Utilisateur(String nom, Decimal compte)
        {
            this.Nom = nom;
            this.Solde = compte;
        }

        public SQLParameter[] GetClef()
        {
            return new SQLParameter[] { new SQLParameter("Nom", Nom) };
        }
        public SQLParameter[] GetElements()
        {
            return new SQLParameter[] { new SQLParameter("Solde", Solde) };
        }
        public string GetTable()
        {
            return "Utilisateur";
        }
        public bool clefIsAuto()
        {
            return false;
        }

        public static Type[] GetParam(int nb)
        {
            foreach (System.Reflection.ConstructorInfo con in typeof(Utilisateur).GetConstructors())
            {
                if (con.GetParameters().Count() == nb)
                    return Array.ConvertAll(con.GetParameters(), item => (Type)item.ParameterType);
            }
            return null;
        }

        public override String ToString()
        {
            return Nom + " Solde : " + Solde;
        }
    }

    public class Compte : SQLExec
    {
        public String Nom { get; set; }
        public Decimal Solde { get; set; }
        public String NomUtilisateur { get; set; }

        public Compte(String nom, Decimal compte, String nomUser)
        {
            this.Nom = nom;
            this.Solde = compte;
            this.NomUtilisateur = nomUser;
        }

        public SQLParameter[] GetClef()
        {
            return new SQLParameter[] { new SQLParameter("Nom", Nom), new SQLParameter("NomUtilisateur", NomUtilisateur) };
        }
        public SQLParameter[] GetElements()
        {
            return new SQLParameter[] { new SQLParameter("Solde", Solde) };
        }
        public string GetTable()
        {
            return "Compte";
        }
        public bool clefIsAuto()
        {
            return false;
        }

        public override String ToString()
        {
            return Nom;
        }

        public static Type[] GetParam(int nb)
        {
            foreach (System.Reflection.ConstructorInfo con in typeof(Compte).GetConstructors())
            {
                if (con.GetParameters().Count() == nb)
                    return Array.ConvertAll(con.GetParameters(), item => (Type)item.ParameterType);
            }
            return null;
        }
    }

    public class ActifPassif : SQLExec
    {
        public enum Evenement { Jour = 1, Semaine, Mois, Annee};
        public enum Action { Revenu = 1, Payement, Transfert };

        public int No { get; set; }
        public String Nom { get; set; }
        public Decimal Montant { get; set; }
        public DateTime Moment { get; set; }
        public Evenement Frequence { get; set; }
        public int NbFrequence { get; set; }
        public DateTime Debut { get; set; }
        public int NbFois { get; set; }
        public DateTime Fin { get; set; }
        public Action Actif { get; set; }
        public String NomCompte { get; set; }
        public String NomTransfert { get; set; }

        public ActifPassif(int no, String nom, Decimal montant, DateTime moment, Evenement frequence, int nbFrequence, DateTime debut, int nbfois, DateTime fin, Action actif, String nomCompte, String transfert)
        {
            this.No = no;
            this.Nom = nom;
            this.Montant = montant;
            this.Moment = moment;
            this.Frequence = frequence;
            this.NbFrequence = nbFrequence;
            this.Debut = debut;
            this.NbFois = nbfois;
            this.Fin = fin;
            this.Actif = actif;
            this.NomCompte = nomCompte;
            this.NomTransfert = transfert;
        }
        public ActifPassif(String nom, Decimal montant, DateTime moment, Evenement frequence, int nbFrequence, DateTime debut, int nbFois, DateTime fin, Action actif, String nomCompte, String transfert) : this(-1, nom, montant, moment, frequence, nbFrequence, debut, nbFois, fin, actif, nomCompte, transfert) { }
        public ActifPassif(Decimal montant, DateTime moment, Action actif, String nomCompte, String transfert) : this(-1, "", montant, moment, Evenement.Jour, 0, new DateTime(1900, 1, 1), 0, new DateTime(1900, 1, 1), actif, nomCompte, transfert) { }
        public ActifPassif() : this(-1, "", 0, DateTime.Now, Evenement.Jour, 0, new DateTime(1900, 1, 1), 0, new DateTime(1900, 1, 1), Action.Revenu, "", "") { }

        public SQLParameter[] GetClef()
        {
            return new SQLParameter[] { new SQLParameter("No", No) };
        }
        public SQLParameter[] GetElements()
        {
            SQLParameter[] p = new SQLParameter[11];
            p[0] = new SQLParameter("Nom", Nom);
            p[1] = new SQLParameter("Montant", Montant);
            p[2] = new SQLParameter("Moment", Moment);
            p[3] = new SQLParameter("Frequence", (int)Frequence);
            p[4] = new SQLParameter("NbFrequence", NbFrequence);
            p[5] = new SQLParameter("Debut", Debut);
            p[6] = new SQLParameter("NbFois", NbFois);
            p[7] = new SQLParameter("Fin", Fin);
            p[8] = new SQLParameter("Actif", (int)Actif);
            p[9] = new SQLParameter("NomCompte", NomCompte);
            p[10] = new SQLParameter("NomTransfert", NomTransfert);
            return p;
        }
        public string GetTable()
        {
            return "ActifPassif";
        }
        public bool clefIsAuto()
        {
            return true;
        }

        public static Type[] GetParam(int nb)
        {
            foreach(System.Reflection.ConstructorInfo con in typeof(ActifPassif).GetConstructors())
            {
                if(con.GetParameters().Count() == nb)
                    return Array.ConvertAll(con.GetParameters(), item => (Type)item.ParameterType);
            }
            return null;
        }

        public bool CanDoAction()
        {
            DateTime point1 = DateTime.Now;
            switch (Frequence)
            {
                case Evenement.Jour:
                    point1 = Fin.AddDays((NbFrequence - 1) * -NbFois);
                    break;
                case Evenement.Semaine:
                    point1 = Fin.AddDays((NbFrequence - 1) * -7 * NbFois);
                    break;
                case Evenement.Mois:
                    point1 = Fin.AddMonths((NbFrequence - 1) * -NbFois);
                    break;
                case Evenement.Annee:
                    point1 = Fin.AddYears((NbFrequence - 1) * -NbFois);
                    break;
            }
            return point1.Date <= DateTime.Now.Date;
        }
    }
}